第1章 並行プログラミングへの第一歩
from Go言語で学ぶ並行プログラミング 他言語にも適用できる原則とベストプラクティス
並行処理のメリット
スループット の向上
マルチコアプロセッサ 上で タスク を 並列処理 することで、スループットが向上する
warning.icon プロセッサを最大限に活用するようにコードを書いた場合のみ
ただしプロセッサが 1 つであっても、I/O 待ち時間を有効に利用すれば、スループットは向上する
応答性の向上
並行処理ではタスクの終了を待つことなくユーザへの応答が可能であるため、応答性が向上する
マルチコアプロセッサかどうかは関係ない
Go での並行処理
Go は並行処理の基本単位をモデル化するために、ゴルーチン と呼ばれる軽量な構造を用いる
軽量であることを踏まえると、Go の基本的な考えは「並列処理は ランタイム と ハードウェア に任せ、プログラマは正しい並行プログラムを書くことに注力するべきである」
この原則に従えば、何かを並行して実行する必要がある場合、資源の割り当てを気にすることなくゴルーチンを作成できる
プログラムは実行されるハードウェアや環境に応じてスケールする
Go では、メモリ共有 で使われる古典的な基本操作(e.g. Mutex や 条件変数)を使うか、 CSP 方式のモデル(チャネル)を使うかを選択してアプリケーションを構築できる
CSP モデルでは、チャネルを用いて通信および同期を行う分離されたゴルーチンを持つため、競合状態 のリスクを減少させることができる
https://scrapbox.io/files/67a9c25e65e82dfe0b49a7de.png
しかし、問題によっては古典的な基本操作の方が良い パフォーマンス、結果を得られる場合もある
性能のスケーリング
アムダールの法則: 固定サイズの問題のパフォーマンスの スケーラビリティ は、逐次処理により制限される
グスタフソンの法則: 余分な資源を効率的に利用する方法を見つけられれば、逐次処理によって制限されることはなくなり、パフォーマンスは スケールアップ し続ける
warning.icon 逐次処理部分が問題の大きさに比例しないことを前提とする